﻿#ifndef WRWORKINFORMATION_H
#define WRWORKINFORMATION_H

#include <QUuid>
#include <QString>
#include <QAtomicInt>
#include <QDomElement>
#include "WRGlobal.h"

//表示基本信息。
class WRWorkInformation
{
private:
    //表示信息数据。
    class InfoData
    {
    private:
        QUuid m_uuid;
        QString m_title;
        QString m_description;
        QAtomicInt m_refCnt;

        //初始化。
        inline InfoData(void)
            : m_refCnt(1)
        {
            //add code here
        }

    public:
        //初始化。
        inline InfoData(const QUuid& uuid, const QString& title, const QString& description)
            : m_uuid(uuid), m_title(title), m_description(description), m_refCnt(1)
        {
            //add code here
        }

        //添加对象引用。
        inline void addRef(void)
        {
            m_refCnt.ref();
        }
        //释放对象引用, 如果引用计数为0，则删除对象，返回True，否则返回False。
        inline bool release(void)
        {
            if (!m_refCnt.deref())
            {
                delete this;
                return true;
            }
            return false;
        }

        //获取工作对象标识。
        inline const QUuid& uuid(void) const
        {
            return m_uuid;
        }
        //获取工作对象名称。
        inline const QString& title(void) const
        {
            return m_title;
        }
        //获取工作对象描述。
        inline const QString& description(void) const
        {
            return m_description;
        }

        //获取默认值。
        WRSOFT_WORKING_COMMON_API static InfoData* defValue();
    };
    //数据。
    InfoData* m_data;

public:
    //初始化基本信息。
    inline WRWorkInformation(void)
        : m_data(InfoData::defValue())
    {
        //add code here
    }
    //初始化基本信息。
    inline WRWorkInformation(const QUuid& uuid, const QString& title, const QString& description)
        : m_data(new InfoData(uuid, title, description))
    {
        //add code here
    }
    //初始化基本信息（复制构造函数）。
    inline WRWorkInformation(const WRWorkInformation& other)
        : m_data(other.m_data)
    {
        m_data->addRef();
    }

    //重载赋值操作符。
    inline WRWorkInformation& operator=(const WRWorkInformation& other)
    {
        if (this != &other)
        {
            m_data->release();
            m_data = other.m_data;
            m_data->addRef();
        }
        return *this;
    }

    //清理当前对象所占用的相关资源。
    ~WRWorkInformation()
    {
        m_data->release();
    }

    //获取工作对象标识。
    inline const QUuid& uuid(void) const
    {
        return m_data->uuid();
    }
    //获取工作对象名称。
    inline const QString& title(void) const
    {
        return m_data->title();
    }
    //获取工作对象描述。
    inline const QString& description(void) const
    {
        return m_data->description();
    }

    //从XML中创建信息。
    WRSOFT_WORKING_COMMON_API bool create(const QDomElement& config);
};

#endif // WRWORKINFORMATION_H
